/* Singleton - kolejka wiadomo���ci Message
	Aby u���y��� obiektu tej klasy MsgQueue::getInstance.metoda_ktorej_chesz_uzyc(TROLOLOLO - wpisz koniecznie)
*/

#pragma once

#include <queue>
#include <iostream>
#include <stdio.h>
#include "Message.h"
#include "semafor2.h"

using namespace std;

class MsgQueue
 {
  private:
		
		queue<Message> queueX;
		int semid, notEmpty;

        MsgQueue() {
			semid = semget(ftok(".",32), 1, IPC_CREAT|0666);
			semctl(semid,0, SETVAL, (int)1);
			notEmpty = semget(ftok(".", 70), 1, IPC_CREAT|0666);
				semctl(notEmpty, 0, SETVAL, (int)0);

		}
        MsgQueue(const MsgQueue &);
        ~MsgQueue(){ semctl(semid,0,IPC_RMID); }
  
 public:
        
		static MsgQueue& getInstance(){
          static MsgQueue instance;
          return instance;
        }

		void pushMessage(Message m){ 
			opusc(semid,0);
			queueX.push(m);
			podnies(notEmpty,0);
			podnies(semid,0);
		};
		
		Message popMessage(){
			opusc(notEmpty,0);
			opusc(semid,0);
				Message m = queueX.front();
				queueX.pop();

			podnies(semid,0);
			return m;
		};

 };
